/**
 * =================================================================
 * 版权所有 2011-2012 深圳市泰海网络科技服务有限公司，并保留所有权利
 * -----------------------------------------------------------------
 * 这不是一个自由软件！您不能在任何未经允许的前提下对程序代码进行修改和使用；
 * 不允许对程序代码以任何形式任何目的的再发布
 * =================================================================
 */
package com.imoney.framework.base.utils;

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import com.imoney.framework.base.exception.ServiceException;

/**
 * 类说明：传参验证<br>
 * 
 * 
 * <p>
 * 详细描述：<br>
 * 
 * </p>
 * <pre>
 * ——————————————————————————————————————————————————————————————————
 * |		修改人		|		修改时间			|		修改原因
 * ——————————————————————————————————————————————————————————————————
 * |	354190 曾宪新	|		2013-1-16		|	
 * ——————————————————————————————————————————————————————————————————
 * </pre>
 * 
 * @author 354190 曾宪新(Xavier.zeng)
 * 
 * CreateDate: 2013-1-16
 */
public class ValidateUtil {
	
	/**
	 * 验证器, 是线程安全的
	 */
    private static Validator validator; 
 
    static { 
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
        validator = factory.getValidator(); 
    } 
    
    /**
     * 方法说明：同时验证类多个参数<br>
     * 
     * @param t
     */
    public static <T> void validateAll(T t, Class<?> ... chk) { 
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(t, chk); 
        if(constraintViolations.size() >= 1) { 
            StringBuilder sb = new StringBuilder(); 
            for(ConstraintViolation<T> constraintViolation: constraintViolations) { 
                sb.append(constraintViolation.getMessage()).append(";"); 
            }
            
            throw new ServiceException(0, sb.toString()); 
        } 
    }
    
    /**
     * 方法说明：验证类第一个参数<br>
     * 
     * @param t
     */
    public static <T> void validate(T t, Class<?> ... chk) { 
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(t, chk); 
        if(constraintViolations.size() >= 1) { 
            ConstraintViolation<T> constraintViolation = constraintViolations.iterator().next();
            throw new ServiceException(0, constraintViolation.getMessage()); 
        } 
    } 
}
